package org.upo.eps.it.phama.dao;

import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.upo.eps.it.phama.bean.Empleado;
import org.upo.eps.it.phama.util.HibernateUtil;

/**
 *
 * @author grupo 4
 */
public class EmpleadoDAO {

    /**
     * Devuelve un objeto de la clase Empleado cuyos atributos user y password
     * correspondan con los aportados como parámetros. Como el atributo user es
     * único, el método sólo puede devolver un objeto o nulo, si no se
     * encontrara.
     *
     * @param user String con el nombre de usuario del empleado
     * @param password String con la contraseña del usuario
     * @return Objeto de la clase Empleado o nulo.
     */
    public static Empleado getByUsername(String user, String password) {
        Empleado empleado;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String sql = String.format("from Empleado where usuario = '%s' and contrasena = '%s'", user, password);
        Query qry = session.createQuery(sql);
        empleado = (Empleado) qry.uniqueResult();
        session.close();

        return empleado;
    }

    /**
     * Obtiene una lista con todos los empleados existentes en la base de datos.
     *
     * @return Lista de objetos de la clase Empleado.
     */
    public static List<Empleado> getEmpleados() {
        List<Empleado> empleados;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String sql = "from Empleado";
        Query qry = session.createQuery(sql);
        empleados = (List<Empleado>) qry.list();
        session.close();

        return empleados;
    }

    /**
     * Efectúa la búsqueda de todos aquéllos empleados cuyos atributos
     * correspondan con todos los parámetros recibidos. Si no se aporta algún
     * parámetro, el mismo será sustituido por el comodín que implica a todos.
     * Como la cadena de búsqueda se construye a base de comparadores
     * <code>like</code>, los parámetros pueden contender el comodín
     * <code>%</code>.
     *
     * @param nombre String con el nombre del empleado que se busca.
     * @param apellido1 String con el primer apellido del empleado.
     * @param apellido2 String con el segundo apellido del empleado.
     * @param categoria String con la categoría a la que pertenece el empleado.
     * @param usuario String con el nombre de usuario del empleado.
     * @return Lista de objetos de la clase Empleado que cumplen con los
     * parámetros aportados.
     */
    public static List<Empleado> search(String nombre, String apellido1, String apellido2, String categoria, String usuario) {
        List<Empleado> resultado;
        /* Si algún parámetro no tuviera contenido, se sustituye por el comodín %, que indica que se ese campo NO se tendrá
         * en cuenta en la búsqueda.
         */
        String n = nombre.trim().isEmpty() ? "%" : nombre.trim();
        String a1 = apellido1.trim().isEmpty() ? "%" : apellido1.trim();
        String a2 = apellido2.trim().isEmpty() ? "%" : apellido2.trim();
        String c = categoria.trim().isEmpty() ? "%" : categoria.trim();
        String u = usuario.trim().isEmpty() ? "%" : usuario.trim();

        /* Finalmente, se construye la cadena sql a base de comparadores like y se ejecuta
         * la consulta.
         */
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String sql = String.format("from Empleado where nombre like '%s' and apellido1 like '%s' and apellido2 like '%s' and categoria like '%s' and usuario like '%s'", n, a1, a2, c, u);
        Query qry = session.createQuery(sql);
        resultado = (List<Empleado>) qry.list();
        session.close();

        return resultado;
    }

    /**
     * Se hace persistente el empleado recibido como parámetro.
     *
     * @param empleado Objeto de la clase Empleado.
     * @throws HibernateException
     */
    public static void save(Empleado empleado) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try {
            // Se guarda el empleado tanto si es nuevo como si ya existe previamente en la base de datos.
            session.saveOrUpdate(empleado.getDireccion());
            session.saveOrUpdate(empleado);
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            throw ex;
        }
    }

    /**
     * Se elimina de la base de datos el empleado cuyo id se recibe como
     * parámetro.
     *
     * @param id Integer con el id del empleado que se quiere eliminar.
     * @throws HibernateException
     */
    public static void delete(int id) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try {
            Query qry = session.createQuery(String.format("delete Empleado where idEmpleado = %d", id));
            qry.executeUpdate();
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            throw ex;
        }
    }
}
